﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Core.Data
{
    /// <summary>
    /// 链接管理类
    /// </summary>
    public static class LinkManager
    {
        private static Wedn.Interface.DAL.ILink dao;
        /// <summary>
        /// 静态全局配置
        /// </summary>
        private static List<Link> links;

        public static List<Link> Links
        {
            get { return LinkManager.links; }
        }

        /// <summary>
        /// 链接管理类构造函数
        /// </summary>
        /// <exception cref="未找到系统数据库访问组件"></exception>
        static LinkManager()
        {
            dao = Wedn.Interface.DAOFactory.CreateLinkDAO();
            if (dao == null)
            {
                throw new System.Exception("缺失数据库访问组件!");
            }
            LoadLink();
        }

        /// <summary>
        /// lock
        /// </summary>
        private static object lockHelper = new object();
        /// <summary>
        /// 初始化
        /// </summary>
        public static void LoadLink()
        {
            if (links == null)
            {
                lock (lockHelper)
                {
                    if (links == null)
                    {
                        links = dao.SelectLinkList();
                    }
                }
            }
        }

        /// <summary>
        /// 向链接表中插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要插入的对象</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Insert(Link link)
        {
            links.Add(link);
            links.Sort();
            return dao.Insert(link);
        }

        /// <summary>
        /// 根据链接ID删除链接表对应的一条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的链接ID</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int id)
        {
            links.Remove(GetLink(id));
            links.Sort();
            return dao.Delete(id);
        }

        /// <summary>
        /// 根据链接ID数组删除链接表对应的多条记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的链接ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        public static int Delete(int[] ids)
        {
            foreach (int id in ids)
            {
                links.Remove(GetLink(id));
            }
            links.Sort();
            return dao.Delete(ids);
        }

        /// <summary>
        /// 更新一个完整链接对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="link">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns> 
        public static int UpdateLink(Link link)
        {
            links.Remove(GetLink(link.Id));
            links.Add(link);
            links.Sort();
            return dao.UpdateLink(link);
        }

        /// <summary>
        /// 根据链接ID数组批量更新多个链接的父ID, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">链接ID数组</param>
        /// <param name="parentId">父ID</param>
        /// <param name="visible">更新的是否可见</param>
        /// <returns>执行结果受影响行数</returns>
        public static int UpdateParentId(int[] ids, int parentId, bool visible)
        {
            int res = dao.UpdateParentId(ids, parentId, visible);
            LoadLink();
            return res;
        }

        /// <summary>
        /// 根据链接ID更新一个链接常用字段, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">链接ID</param>
        /// <param name="name">更新的名称(不更新则传入null)</param>
        /// <param name="url">更新的网址(不更新则传入null)</param>
        /// <param name="target">更新的目标窗口(不更新则传入null)</param>
        /// <param name="visible">更新的是否可见</param>
        /// <returns>执行结果受影响行数</returns> 
        public static int UpdateInfo(int id, string name, string url, string target, bool visible)
        {
            int res = dao.UpdateInfo(id, name, url, target, visible);
            LoadLink();
            return res;
        }

        #region 从内存集合中获取数据

        /// <summary>
        /// 选取链接总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        public static int GetLinksCount(string where)
        {
            return links.Count;
        }

        /// <summary>
        /// 取出当前链接表中的所有链接信息, 返回所有链接信息集合
        /// </summary>
        /// <returns>所有链接信息对象集合</returns>
        public static List<Link> GetLinkList()
        {
            return links;
        }

        /// <summary>
        /// 根据父ID,链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="parentId">父ID</param>
        /// <param name="type">类型名称(nav;footer;blogroll...)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        public static List<Link> GetLinkList(int parentId, string type, bool visible)
        {
            List<Link> list = links;
            if (parentId != -1)
            {
                list = list.FindAll(delegate(Link link) { return link.ParentId == parentId; });
            }
            if (!string.IsNullOrEmpty(type))
            {
                list = list.FindAll(delegate(Link link) { return link.Type == type; });
            }
            return list.FindAll(delegate(Link link) { return link.Visible == visible; });
        }

        /// <summary>
        /// 根据ID取出当前链接表中的链接对象
        /// </summary>
        /// <returns>链接对象</returns>
        public static Link GetLink(int id)
        {
            //List<Link> list = links.FindAll(delegate(Link link) { return link.Id == id; });
            //return list.Count > 0 ? list[0] : null;
            foreach (Link item in links)
            {
                if (item.Id == id)
                {
                    return item;
                }
            }
            return null;
        }

        #endregion

        #region 从数据库获取数据
        /// <summary>
        /// 从数据库获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        public static int GetMaxIdFromDB()
        {
            return dao.SelectMaxId();
        }

        /// <summary>
        /// 从数据库选取链接总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        public static int GetLinksCountFromDB(string where)
        {
            return dao.SelectLinksCount(where);
        }

        /// <summary>
        /// 从数据库取出当前链接表中的所有链接信息, 返回所有链接信息集合
        /// </summary>
        /// <returns>所有链接信息对象集合</returns>
        public static List<Link> GetLinkListFromDB()
        {
            return dao.SelectLinkList();
        }

        /// <summary>
        /// 从数据库根据父ID,链接类型和是否启用选取链接对象集合, 返回链接信息对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="parentId">父ID</param>
        /// <param name="type">类型名称(nav;footer;blogroll...)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <returns>链接信息对象集合</returns>
        public static List<Link> GetLinkListFromDB(int parentId, string type, bool visible)
        {
            return dao.SelectLinkList(parentId, type, visible);
        }

        /// <summary>
        /// 从数据库根据检索条件选取链接对象集合, 返回满足条件的链接对象集合, 不存在则返回NULL
        /// </summary>
        /// <param name="keyword">关键词(忽略则传入null)</param>
        /// <param name="visible">是否是可用链接</param>
        /// <param name="parentId">父ID(忽略该条件传入-1)</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <param name="recordCount">返回查询到的记录数量</param>
        /// <returns>满足条件的链接对象集合</returns>
        public static List<Link> GetLinkListFromDB(string keyword, bool visible, int parentId, int pageSize, int pageIndex, string orderField, int order, out int recordCount)
        {
            return dao.SelectLinkList(keyword, visible, parentId, pageSize, pageIndex, orderField, order, out recordCount);
        }

        /// <summary>
        /// 从数据库根据ID取出当前链接表中的链接对象
        /// </summary>
        /// <returns>链接对象</returns>
        public static Link GetLinkFromDB(int id)
        {
            return dao.SelectLink(id);
        }
        #endregion
    }
}
